package gjbsh.bangong.ds.controller;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import gjbsh.support.LoginUser;
import gjbsh.support.AppGlobalConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import gjbsh.bangong.ds.model.单位;
import gjbsh.bangong.ds.model.单位管理员;
import gjbsh.bangong.ds.model.用户;
import gjbsh.bangong.ds.service.单位Service;
import gjbsh.bangong.ds.service.单位管理员Service;
import gjbsh.bangong.ds.service.用户Service;
import gjbsh.support.BooleanMessage;
import gjbsh.support.JsonResult;
import gjbsh.support.StringHandle;

/**
 * @author yaolongjun
 * @date   2020年5月20日 下午5:58:09
 */
@RestController
@RequestMapping("dept_guanliyuan")
public class 单位管理员Controller {
	
	private Logger logger = LoggerFactory.getLogger(getClass());
	
	@Autowired
	单位管理员Service ddService;
	
	@Autowired
	用户Service dd用户Service;
	
	@Autowired
	单位Service dd单位Service;
	
	/**
	 * @author yaolongjun
	 * @description	根据单位ID查询单位管理员
	 */
	@RequestMapping("find_custom_by_deptid")
	public JsonResult<?> find_custom_by_deptid(@RequestParam("deptid")String ppDeptId,HttpServletRequest request){
		try {
			if("".equals(ppDeptId)) {
				return JsonResult.getErrorResult("单位ID不能为空");
			}

			LoginUser loginUser = (LoginUser) request.getAttribute(AppGlobalConfig.REQUEST_LOGINUSER_NAME);
			String pp单位Id = loginUser.getDeptid();
			if(pp单位Id==null||pp单位Id.equals("")){
				return JsonResult.getErrorResult("当前账户信息有误！");
			}
			// 通过序列编码判断是否是本单位下级
			单位 mm当前单位 = dd单位Service.findOne(pp单位Id); //
			List<Map<String,Object>> mm下级单位 = ddService.findShangjiByDeptId(pp单位Id,ppDeptId);
			if(mm下级单位.size()==0){
				return JsonResult.getErrorResult("当前查询单位非相关账户");
			}

			return JsonResult.getSuccessResult(ddService.findCustomByDeptId(ppDeptId));
		} catch (Exception e) {
			logger.error("单位管理员Controller->find_custom_by_deptid: "+e.getMessage());
			return JsonResult.getErrorResult("根据单位id查询单位管理员失败");
		}
	}
	
	/**
	 * @author yaolongjun
	 * @description	根据单位管理员ID查询
	 */
	@RequestMapping("find_by_deptmanageid")
	public JsonResult<?> find_by_deptmanageid(@RequestParam("deptmanageid")String ppDeptmanageId){
		try {
			if("".equals(ppDeptmanageId)) {
				return JsonResult.getErrorResult("单位管理员ID不能为空");
			}
			return JsonResult.getSuccessResult(ddService.findByDeptmanageId(ppDeptmanageId));
		} catch (Exception e) {
			logger.error("单位管理员Controller->find_by_deptmanageid: "+e.getMessage());
			return JsonResult.getErrorResult("根据单位管理员id查询单位管理员失败");
		}
	}
	
	/**
	 * @author yaolongjun
	 * @description	新增单位管理员
	 */
	@RequestMapping("add")
	public JsonResult<?> add(@RequestParam("deptid")String ppDeptId,
			@RequestParam("deptmanageid")String ppDeptmanageId,
			@RequestParam("loginname")String ppLoginname,
			@RequestParam("username")String ppUsername,
			@RequestParam("loginpassword")String ppLoginpassword,
			@RequestParam("phone")String ppPhone,
			@RequestParam("email")String ppEmail,
			@RequestParam("zhuangtai")int ppZhuangtai){
		try {
			if("".equals(ppDeptId)) {
				return JsonResult.getErrorResult("单位ID不能为空");
			}
			if("".equals(ppLoginpassword)) {
				return JsonResult.getErrorResult("登录密码不能为空");
			}
			if(!Detectpassword(ppLoginpassword)) {
				return JsonResult.getErrorResult("注册失败！用户密码需长度不少于8位且至少包含大写字母、小写字母、数字和特殊符号。");
			}
			
			// 查询账号是否已存在
			List<用户> mmUserList = dd用户Service.findByLoginname(ppLoginname);
			if(mmUserList.size() > 0) {
				return JsonResult.getErrorResult("帐号已存在，请重试");
			}
			
			// 单位管理员
			单位管理员 mmDeptmanage = new 单位管理员();
			ppDeptmanageId = UUID.randomUUID().toString();
			String mmUserId = UUID.randomUUID().toString();
			mmDeptmanage.set单位管理员id(ppDeptmanageId);
			mmDeptmanage.set单位id(ppDeptId);
			mmDeptmanage.set用户id(mmUserId);
			
			// 用户
			用户 mmUser = new 用户();
			mmUser.set用户id(mmUserId);
			
			// 检查数据合法性
			BooleanMessage mmBooleanMessage = checkInputData_add(mmDeptmanage,mmUser,ppLoginname,ppUsername,
					ppLoginpassword,ppPhone,ppEmail,ppZhuangtai);
			if(!mmBooleanMessage.isOk()) {
				return JsonResult.getErrorResult(mmBooleanMessage.getMessage().toString());
			}
			
			// 新增单位管理员
			if(!ddService.addCustom(mmDeptmanage,mmUser,ppLoginpassword)) {
				return JsonResult.getErrorResult("新增单位管理员失败");
			}else {
				return JsonResult.getSuccessResult("新增单位管理员成功");
			}
		} catch (Exception e) {
			logger.error("单位管理员Controller->add: "+e.getMessage());
			return JsonResult.getErrorResult("新增单位管理员失败");
		}
	}
	
	// 新增时，检查数据合法性
	private BooleanMessage checkInputData_add(单位管理员 mmDeptmanage, 用户 mmUser, String ppLoginname, String ppUsername,
			String ppLoginpassword, String ppPhone, String ppEmail, int ppZhuangtai) {
		ppLoginname = ppLoginname.trim();
		ppUsername = ppUsername.trim();
		ppLoginpassword = ppLoginpassword.trim();
		ppPhone = ppPhone.trim();
		ppEmail = ppEmail.trim();
		
		if("".equals(ppLoginname)) {
			return BooleanMessage.getErrorMessage("登录账号不能为空");
		}
		if(StringHandle.getStringByteLength(ppLoginname) > 50) {
			return BooleanMessage.getErrorMessage("登录账号不可超过50字节");
		}
		
		if("".equals(ppUsername)) {
			return BooleanMessage.getErrorMessage("用户名称不能为空");
		}
		if(StringHandle.getStringByteLength(ppUsername) > 200) {
			return BooleanMessage.getErrorMessage("用户名称不可超过200字节");
		}
		
		if("".equals(ppLoginpassword)) {
			return BooleanMessage.getErrorMessage("登录密码不能为空");
		}
		if(StringHandle.getStringByteLength(ppLoginpassword) > 50) {
			return BooleanMessage.getErrorMessage("登录密码不可超过50字节");
		}
		
		if("".equals(ppPhone)) {
			return BooleanMessage.getErrorMessage("手机号码不能为空");
		}
		if(StringHandle.getStringByteLength(ppPhone) > 50) {
			return BooleanMessage.getErrorMessage("手机号码不可超过50字节");
		}
		
		if("".equals(ppEmail)) {
			return BooleanMessage.getErrorMessage("电子邮件不能为空");
		}
		if(StringHandle.getStringByteLength(ppEmail) > 50) {
			return BooleanMessage.getErrorMessage("电子邮件不可超过50字节");
		}
		
		mmDeptmanage.set状态(BigDecimal.valueOf(ppZhuangtai));
		
		mmUser.set登录帐号(ppLoginname);
		mmUser.set用户名称(ppUsername);
		mmUser.set证件类型id("1");
		mmUser.set证件号码("01234567890123456789012345678901234567890123456789");
		mmUser.set是否锁定("100");
		mmUser.set创建日期(new Date());
		mmUser.set最后修改日期(new Date());
		mmUser.set手机号码(ppPhone);
		mmUser.set电子邮件(ppEmail);
		mmUser.set是否更新识别码(BigDecimal.ZERO);
		
		return BooleanMessage.getSuccessMessage("数据合法");
	}

	/**
	 * @author yaolongjun
	 * @description	修改账号信息
	 */
	@RequestMapping("modify")
	public JsonResult<?> modify(@RequestParam("deptid")String ppDeptId,
			@RequestParam("deptmanageid")String ppDeptmanageId,
			@RequestParam("loginname")String ppLoginname,
			@RequestParam("username")String ppUsername,
			@RequestParam("loginpassword")String ppLoginpassword,
			@RequestParam("phone")String ppPhone,
			@RequestParam("email")String ppEmail,
			@RequestParam("zhuangtai")int ppZhuangtai,HttpServletRequest request){
		try {

			LoginUser loginUser = (LoginUser) request.getAttribute(AppGlobalConfig.REQUEST_LOGINUSER_NAME);
			String pp单位Id = loginUser.getDeptid();
			if(pp单位Id==null||pp单位Id.equals("")){
				return JsonResult.getErrorResult("当前账户信息有误！");
			}

			if("".equals(ppDeptmanageId)) {
				return JsonResult.getErrorResult("单位管理员ID不能为空");
			}
			// 如果密码不为空
			if(!"".equals(ppLoginpassword)) {
				if(!Detectpassword(ppLoginpassword)) {
					return JsonResult.getErrorResult("注册失败！用户密码需长度不少于8位且至少包含大写字母、小写字母、数字和特殊符号。");
				}
			}
			单位管理员 mmDeptmanage = ddService.findOne(ppDeptmanageId);
			if(mmDeptmanage == null) {
				return JsonResult.getErrorResult("要修改的管理员不存在");
			}
			
			String mmUserid = mmDeptmanage.get用户id();
			用户 mmUser = dd用户Service.findOne(mmUserid);
			if(mmUser == null) {
				return JsonResult.getErrorResult("要修改的管理员信息不存在");
			}

			// 通过序列编码判断是否是本单位下级
			List<Map<String,Object>> mm下级单位 = dd单位Service.findShangjiByDeptId(pp单位Id, ppDeptId);
			if(mm下级单位.size()==0){
				return JsonResult.getErrorResult("当前查询单位非相关账户");
			}
			
			// 检查数据合法性
			BooleanMessage mmBooleanMessage = checkInputData_modify(mmDeptmanage,mmUser,ppUsername,
					ppPhone,ppEmail,ppZhuangtai);
			if(!mmBooleanMessage.isOk()) {
				return JsonResult.getErrorResult(mmBooleanMessage.getMessage().toString());
			}
			
			// 修改账号信息
			if(!ddService.modifyCustom(mmDeptmanage,mmUser,ppLoginpassword)) {
				return JsonResult.getErrorResult("修改账号信息失败");
			}else {
				return JsonResult.getSuccessResult("修改账号信息成功");
			}
		} catch (Exception e) {
			logger.error("单位管理员Controller->modify: "+e.getMessage());
			return JsonResult.getErrorResult("修改单位管理员失败");
		}
	}

	// 修改时，检查数据合法性
	private BooleanMessage checkInputData_modify(单位管理员 mmDeptmanage, 用户 mmUser, String ppUsername,
			String ppPhone, String ppEmail, int ppZhuangtai) {
		ppUsername = ppUsername.trim();
		ppPhone = ppPhone.trim();
		ppEmail = ppEmail.trim();
		
		if("".equals(ppUsername)) {
			return BooleanMessage.getErrorMessage("用户名称不能为空");
		}
		if(StringHandle.getStringByteLength(ppUsername) > 200) {
			return BooleanMessage.getErrorMessage("用户名称不可超过200字节");
		}
		
		if("".equals(ppPhone)) {
			return BooleanMessage.getErrorMessage("手机号码不能为空");
		}
		if(StringHandle.getStringByteLength(ppPhone) > 50) {
			return BooleanMessage.getErrorMessage("手机号码不可超过50字节");
		}
		
		if("".equals(ppEmail)) {
			return BooleanMessage.getErrorMessage("电子邮件不能为空");
		}
		if(StringHandle.getStringByteLength(ppEmail) > 50) {
			return BooleanMessage.getErrorMessage("电子邮件不可超过50字节");
		}
		
		mmDeptmanage.set状态(BigDecimal.valueOf(ppZhuangtai));
		
		mmUser.set用户名称(ppUsername);
		mmUser.set手机号码(ppPhone);
		mmUser.set电子邮件(ppEmail);
		mmUser.set最后修改日期(new Date());
		
		return BooleanMessage.getSuccessMessage("数据合法");
	}
	
	@RequestMapping("add_dept_and_guanliyuan")
	public JsonResult<?> add_dept_and_guanliyuan(
			@RequestParam("deptnamename")String ppDeptName,
			@RequestParam("shangjideptid")String ppShangjideptId,
			@RequestParam("zhanghao")String ppZhanghao,
			@RequestParam("password")String ppPassword,
			@RequestParam("yonghuname")String ppYonghuName,
			@RequestParam("shoujihaoma")String ppShoujihaoma,
			@RequestParam("email")String ppEmail,
			@RequestParam("checkcode") String ppCheckCode,
			HttpServletRequest request){
		try {
			ppDeptName =ppDeptName.trim();
			ppShangjideptId =ppShangjideptId.trim();
			ppZhanghao =ppZhanghao.trim();
			ppPassword =ppPassword.trim();
			ppYonghuName =ppYonghuName.trim().toUpperCase();
			ppShoujihaoma =ppShoujihaoma.trim();
			ppEmail =ppEmail.trim();
			
			
			
			if("".equals(ppDeptName)) {
				return JsonResult.getErrorResult("单位名称不能为空");
			}
			if(StringHandle.getStringByteLength(ppDeptName) > 255) {
				return JsonResult.getErrorResult("单位名称不可超过255字节");
			}
			
			if("".equals(ppShangjideptId)) {
				return JsonResult.getErrorResult("上级单位id不能为空");
			}
			
			if("".equals(ppZhanghao)) {
				return JsonResult.getErrorResult("账号不能为空");
			}
			if(StringHandle.getStringByteLength(ppZhanghao) > 50) {
				return JsonResult.getErrorResult("账号不可超过50字节");
			}
			
			if("".equals(ppPassword)) {
				return JsonResult.getErrorResult("密码不能为空");
			}
			if(StringHandle.getStringByteLength(ppPassword) > 50) {
				return JsonResult.getErrorResult("密码不可超过50字节");
			}
			
			if("".equals(ppYonghuName)) {
				return JsonResult.getErrorResult("用户名称不能为空");
			}
			if(StringHandle.getStringByteLength(ppYonghuName) > 200) {
				return JsonResult.getErrorResult("用户名称不可超过200字节");
			}
			
			if("".equals(ppShoujihaoma)) {
				return JsonResult.getErrorResult("手机号码不能为空");
			}
			if(StringHandle.getStringByteLength(ppShoujihaoma) > 50) {
				return JsonResult.getErrorResult("手机号码不可超过50字节");
			}
			
			if("".equals(ppEmail)) {
				return JsonResult.getErrorResult("电子邮件不能为空");
			}
			if(StringHandle.getStringByteLength(ppEmail) > 50) {
				return JsonResult.getErrorResult("电子邮件不可超过50字节");
			}

			///检查验证码
			if(request.getSession().getAttribute("register") == null){
				return JsonResult.getErrorResult("注册失败！验证码失效，请刷新验证码。");
			}

			String logincode = (String)request.getSession().getAttribute("register");
			if(!logincode.equals(ppCheckCode)){
				return JsonResult.getErrorResult("注册失败！验证码错误。");
			}
			
			// 查询账号是否已存在
			List<用户> mmUserList = dd用户Service.findByLoginname(ppZhanghao);
			if(mmUserList.size() > 0) {
				return JsonResult.getErrorResult("帐号已存在，请重试");
			}
			
			// 新建 单位id 单位管理id 用户id
			String ppDeptId = UUID.randomUUID().toString();
			String ppDeptmanageId = UUID.randomUUID().toString();
			String mmUserId = UUID.randomUUID().toString();
			
			// 单位
			单位 mmDept = new 单位();
			
			mmDept.set上级单位id(ppShangjideptId);
			mmDept.set创建日期(new Date());
			mmDept.set单位id(ppDeptId);
			mmDept.set单位名称(ppDeptName);
			mmDept.set单位所属部门id("");
			mmDept.set单位类型id("50");
			mmDept.set备注("非设站培训班单位注册");
			mmDept.set建制序列编码("");
			mmDept.set最后修改日期(new Date());
			mmDept.set状态(new BigDecimal("100"));
			mmDept.set省份id(ppShangjideptId);
			
			// 查询该单位是否存在
			单位 mm单位 = dd单位Service.findOneByDeptname(ppDeptName);
			if(mm单位 != null) {
				
				if(!mm单位.get单位类型id().equals("50")) {
					return JsonResult.getErrorResult("该单位已存在，请联系该单位管理员进行新增。");
				}else {
					mmDept = null;
				}
			}
			
			// 单位管理员
			单位管理员 mmDeptmanage = new 单位管理员();
			
			mmDeptmanage.set单位管理员id(ppDeptmanageId);
			mmDeptmanage.set单位id(ppDeptId);
			mmDeptmanage.set用户id(mmUserId);
			mmDeptmanage.set状态(new BigDecimal(100));
			
			
			
			// 用户
			用户 mmUser = new 用户();
			mmUser.set用户id(mmUserId);
			mmUser.set是否锁定("100");
			mmUser.set创建日期(new Date());
			mmUser.set最后修改日期(new Date());
			mmUser.set用户名称英文("");
			mmUser.set识别码("");
			mmUser.set是否更新识别码(BigDecimal.valueOf(0));
			mmUser.set临时标识(BigDecimal.valueOf(0));
			mmUser.set备注("非设站培训班单位注册");
			mmUser.set手机号码(ppShoujihaoma);
			mmUser.set用户名称(ppYonghuName);
			mmUser.set电子邮件(ppEmail);
			mmUser.set登录密码(ppPassword);
			mmUser.set登录帐号(ppZhanghao);
			mmUser.set证件号码("123123123");
			
            boolean mmIsAdd = ddService.addCustomAll(mmDeptmanage, mmUser, mmDept, ppPassword);
			
			// 新增单位管理员及单位
			if(!mmIsAdd) {
				return JsonResult.getErrorResult("新增单位及管理员失败");
			}else {
				return JsonResult.getSuccessResult("新增单位及管理员成功");
			}
			
		} catch (Exception e) {
			logger.error("单位管理员Controller->add_dept_and_guanliyuan: "+e.getMessage());
			return JsonResult.getErrorResult("新增单位和单位管理员失败");
		}
	}
	
    public static final String password = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,}$";
	
	public static boolean Detectpassword(String str) {

        return str.matches(password);
	   
	}

}
